<?php
class PartidosController extends AppController {

	var $name = 'Partidos';
	var $helpers = array('Html', 'Form','Javascript','Ajax','chat.AjaxChat');
	var $components = array('RequestHandler');
	
	//var $rivales=array(0 =>'Vs Pc','Vs Humano');
	var $rivales=array(1 =>'Vs Humano');
	//var $nivelPC=array(0 =>'Facil','Intermedio','Dificil','Muy Dificil Ya');
	var $nivelJuego=array(1 =>'Nivel 1','Nivel2','Nivel3');
	/* 
	var $modalidad=array(0 =>'Jugar por Cantidad Goles','Jugar por Tiempo');
	*/
	var $modalidad=array(0 =>'Jugar por Cantidad Goles');
	
	var $empieza=array(0 =>'YO','Oponente');
	var $cantGoles=array(1 =>1,2,3,4,5,6,7,8,9,10);

	
	function beforeFilter() {
		parent::beforeFilter(); 
		$this->Auth->allowedActions = array('index','view', 'add','join','observar','salir');
	}
	
/*Lista los partidos que estan ocurriendo en una sala ($salaId). Muestra los detalles del partido*/
	function index($salaId = null) {
		//$this->Session->setFlash(__('Usuario:'.$this->Auth->user('user'), true));
		if (!$salaId){
			$this->Session->setFlash(__('Sala invalida', true));
			$this->redirect(array('controller' => 'salas','action'=>'index'));
		}
		if($this->Auth->user()){ //si el usuario esta autenticado
			
			$sala = $this->Partido->Sala->read(null, $salaId);//Obtiene informacion de la sala
			if($sala){
				if($sala['Sala']['tiposala_id'] == 2){//si la sala es privada
					$permisoInvitacion = $this->Partido->Sala->fueInvitado($this->Auth->user('user'), $salaId);
					
					if(!$permisoInvitacion){
						$this->Session->setFlash(__('No puede ingresar a la sala porque no fue invitado', true));
						$this->redirect(array('controller' => 'salas','action'=>'indexPrivadas'));					
					}
				}
			}	
			$existe=ClassRegistry::init('SalasUser')->find('first',array('conditions' => array('SalasUser.user_id' => $this->Auth->user('user'),'SalasUser.sala_id' => $salaId)));
			if(!$existe){
				$permiso=$this->Partido->Sala->controlarCantidadUsuarios($salaId,$this->Auth->user('grupo_id'),$this->Auth->user('puntos'));
				
				
				if (!$permiso){ // no puede ingresar (saturada Sala)
 					$this->Session->setFlash(__('No puede ingresar a la sala, esta saturada o bien no tiene los puntos necesarios', true));
					$this->redirect(array('controller' => 'salas','action'=>'index'));
				}else{
					$data = null;
					$data = array('user_id' => $this->Auth->user('user'),'sala_id' => $salaId,'tipo' => 'Jugador');
					ClassRegistry::init('SalasUser')->create();
					ClassRegistry::init('SalasUser')->save($data);	
				}
			}else{
				//actualizar que el usuario aun esta en la sala
				$salasUser = ClassRegistry::init('SalasUser')->stillInSala($this->Auth->user('user'),$salaId);
			}
		}else {
			$this->Session->setFlash(__('No puede ingresar a salas. Asegurese de loguearse', true));
			$this->redirect(array('controller' => 'users','action'=>'login'));
		}

		
		//Los partidos con estado>9 han terminado
		$this->set('partidos', $this->Partido->find('all', array('conditions'=> array('Partido.sala_id =' => $salaId, 'Partido.estado <'=> 10))));
		//Obtiene el partido si tiene del usuario
		$myPartido=$this->Partido->tieneOtrosPartidos($this->Auth->user('user'));
		if($myPartido){
			$this->set('myPartido',$myPartido['Partido']['partido']);
		}else{
			$this->set('myPartido',null);
		}
		$this->set('sala',$this->Partido->Sala->find('first',array('fields'=>array('Sala.nombre'),'conditions'=> array('Sala.sala'=>$salaId))));
		$this->set('salaId',$salaId);

		if($this->Auth->user()){ //para que el chat sepa quien es el usuario
			$user=array('user'=>$this->Auth->user('user'),'grupo_id'=>$this->Auth->user('grupo_id'),'username'=>$this->Auth->user('username'));
		}else{
			$user=null;	
		}
		$this->set('user',$user);
		if($this->params['isAjax']){
			//si la peticion es ajax, actual la vista ajax_index.ctp
			$this->render('ajax_index');
		}
		
		
	}	
	
/*Agregar Partido. El creador es duenho del partido. */
	function add($salaId = null) {
		$sala=$this->Partido->Sala->findBySala($salaId);
		$this->set('rivales', $this->rivales);
			//$this->set('nivelPC', $this->nivelPC);
		$this->set('niveles', $this->nivelJuego);
		$this->set('modalidades', $this->modalidad);
		$this->set('empieza', $this->empieza);
		$this->set('cantGoles', $this->cantGoles);	
			//print_r($sala);
		$this->set('sala',$sala);
		//print_r($sala);
		if (empty($this->data)) {
			if($this->Auth->user()){ //si el usuario esta autenticado
				$partido=$this->Partido->tieneOtrosPartidos($this->Auth->user('user'));
				//print_r($existe);
				
				if($partido){ //Si no esta sentado en otro partido
					$this->Session->setFlash(__('Tiene otro partido activo = '.$partido['Partido']['partido'], true));
					$this->redirect(array('action'=>'index', $partido['Partido']['sala_id']));
				}
			}else {
				$this->Session->setFlash(__('No puede crear partidos. Asegurese de loguearse', true));
				$this->redirect(array('controller' => 'users','action'=>'login'));
			}
			
		} elseif (!empty($this->data)) {
			//Estado 1 seria creado
			$this->data['Partido']['fechahoraini']=date('Y-m-d H:i:s');
			$this->data['Partido']['estado']=1;
			$this->data['Partido']['finalizo']=0;
			//Las fichas blancas siempre empiezan
			if($this->data['Partido']['empieza']==0){//eligio YO
				$this->data['Partido']['empieza']=1; //empieza
			}
			else{ //Eligio Oponente
				$this->data['Partido']['empieza']=2; //empieza
			}
			
			$this->data['Partido']['user_id']=$this->Auth->user('user');
			$this->data['Partido']['cantusuarios']=1; //el usuario que creo
			//Todos los partidos creados por usuarios son entre 2!!
			$this->data['Partido']['cantmaxusuarios']=2;
			$this->data['Partido']['cantobservadores']=0;
			
			$this->Partido->create();
			if ($this->Partido->save($this->data)) {
				$this->Session->setFlash(__('El Partido se ha creado', true));
				$this->redirect(array('action'=>'index',$this->data['Partido']['sala_id']));
			} else {
				$this->Session->setFlash(__('El Partido no pudo crearse, intente de vuelta', true));
			}
		}
	}
	
/*
	Para unirse a un partido de id: $partidoId
	Por el momento solo para partidos entre 2
*/	
	function join($partidoId = null, $salaId = null) {
		if($this->Auth->user()){ //si el usuario esta autenticado
			$partido=$this->Partido->tieneOtrosPartidos($this->Auth->user('user'));
			//print_r($existe);
			
			if($partido){ //Si esta sentado en otro partido
				$this->Session->setFlash(__('Tiene otro partido activo = '.$partido['Partido']['partido'], true));
				$this->redirect(array('action'=>'index', $partido['Partido']['sala_id']));
			}
			//si puede unirse al partido como jugador
			$permiso=$this->Partido->controlarPermiso($this->Auth->user('user'),$partidoId,1);
			if (!$permiso){ // no puede ingresar (Partido lleno)
				$this->Session->setFlash(__('No puede ingresar al Partido', true));
				$this->redirect(array('action'=>'index',$salaId));
			}else{
				$partidoUnir=$this->Partido->findByPartido($partidoId);
				if($partidoUnir['Partido']['empieza']==1){//Empieza el que creo el partido. Empieza el usuario local
					$orden=2; //entonces el usuario que se une no empieza
				}else{
					$orden=1; //el usuario que se une empieza
				}
				$partidosUser = null;
				$partidosUser = array('user_id' => $this->Auth->user('user'),'partido_id' => $partidoId,'orden'=>$orden,'estado' => 1,'localvisitante'=> 2,'fechahora' => date('Y-m-d H:i:s'));
				$this->Partido->PartidosUser->create();
				if($this->Partido->PartidosUser->save($partidosUser)){ //se inserta en la tabla partidos_user
					$this->Partido->id = $partidoUnir['Partido']['partido'];
					$this->Partido->saveField('user_visitante',$this->Auth->user('user')); //se guarda el id del usuario
					$this->Session->setFlash(__('Se unio al partido', true));
					$this->redirect(array('action'=>'index',$salaId));
				}else{
					$this->Session->setFlash(__('No pudo unirse al partido', true));
					$this->redirect(array('action'=>'index',$salaId));
				}
				
			}	
		}else {
			$this->Session->setFlash(__('No puede unirse a partidos. Asegurese de loguearse', true));
			$this->redirect(array('controller' => 'users','action'=>'login'));
		}
	}
	
/*Para observar un partido que ya empezo a partir de TRIAL
 estado=4 en tabla partido si el partido empezo
*/	
	function observar($partidoId = null, $salaId = null, $esTorneo=0) {
		if($this->Auth->user()){ //si el usuario esta autenticado
			//si puede unirse al partido como observador
			$permiso=$this->Partido->controlarPermiso($this->Auth->user('user'),$partidoId,2);
			if (!$permiso){ // no puede ingresar (Partido lleno)
				$this->Session->setFlash(__('No puede observar el Partido', true));
				$this->redirect(array('action'=>'index',$salaId));
			}else{
				$existe=$this->Partido->UsersObservaPartido->find('first',array('conditions' => array('UsersObservaPartido.user_id' => $this->Auth->user('user'),'UsersObservaPartido.partido_id' => $partidoId)));
				if(!$existe){ // si el usuario aun no esta observando, se le agrega
					$partidosObservaUser = null;
					$partidosObservaUser = array('user_id' => $this->Auth->user('user'),'partido_id' => $partidoId,'estado' => 1,'fechahoraini' => date('Y-m-d H:i:s'));
					$this->Partido->UsersObservaPartido->create();
					if($this->Partido->UsersObservaPartido->save($partidosObservaUser)){ //se inserta en la tabla partidos_user
		/*Tengo que redirigir a la pagina donde se juega dicho partido*/
						$this->Session->setFlash(__('Puede ver el partido', true));
						$this->redirect(array('controller'=>'jugadas','action'=>'view',$partidoId));
					}else{
						if(!$esTorneo){
							$this->Session->setFlash(__('No puede observar el partido', true));
							$this->redirect(array('action'=>'index',$salaId));
						}else{
							$this->Session->setFlash(__('No puede observar el partido', true));
							$this->redirect(array('controller'=>'torneos','action'=>'view',$salaId));
						}
					}
				}else{ //el usuario ya esta observando
					$this->redirect(array('controller'=>'jugadas','action'=>'view',$partidoId));
				}
			}
		}else {
			$this->Session->setFlash(__('No puede unirse a partidos. Asegurese de loguearse', true));
			$this->redirect(array('controller' => 'users','action'=>'login'));
		}
	}

	
/* Utilizada por los usuarios que son jugadores para salir de su partido si aun no empezo.
  caso 1: Si el usuario creo el partido. Se elimina el partido
  caso 2: Si el usuario se unio al partido. Sale del partido sin eliminar el registro del partido.
	Parametros:
- $id : Identificador del partidoo
- $salaId : Identificador de la sala
*/
	function salir($id = null, $salaId = null){
		if (!$id) {
			$this->Session->setFlash(__('Invalid id for Partido', true));
			$this->redirect(array('action'=>'index'));
		}
		if($this->Auth->user()){ // si esta autenticado
			$partido=$this->Partido->findByPartido($id);
			//print_r($partido);
			if($partido['Partido']['estado']<4){ // si aun no empezo el partido
				if($this->Auth->user('user')==$partido['Partido']['user_id']){ // si el usuario que quiere borrar es el que creo
					if($this->Partido->del($id)) { //se borra el partido
						$this->Session->setFlash(__('Partido Borrado', true));
						$this->redirect(array('action'=>'index',$salaId));
					}else{
						$this->Session->setFlash(__('El partido no pudo borrarse', true));
						$this->redirect(array('action'=>'index',$salaId));
					}
				}else{ //si no lo creo se buscan los otros usuarios en el partido asociado
					$userPartido=$this->Partido->PartidosUser->salirPartido($id,$this->Auth->user('user'));
					if($userPartido==0){ 
						$this->Session->setFlash(__('No esta en dicho partido', true));
						$this->redirect(array('action'=>'index',$salaId));
					}elseif($userPartido==2){
						$this->Session->setFlash(__('No pudo salir del partido', true));
						$this->redirect(array('action'=>'index',$salaId));
					}else{
						$this->Partido->id = $partido['Partido']['partido'];
						$this->Partido->saveField('estado',1);//Partido finalizo xq el usuario salio
						$this->Session->setFlash(__('Ha salido del partido', true));
						$this->redirect(array('action'=>'index',$salaId));	
					}
				}
			}else{// ya empezo el partido y un usuario salio. Entonces finalizo el partido
				$partidosUser=$this->Partido->PartidosUser->find('first', array('conditions'=>array('PartidosUser.partido_id'=>$partido['Partido']['partido'], 'PartidosUser.user_id'=>$this->Auth->user('user'))));
				
				if($partidosUser['PartidosUser']['localvisitante']==1){//si es local
					$this->Partido->id = $partido['Partido']['partido'];
					$this->Partido->saveField('goleslocal',0); //local pierde porque salio
					$this->Partido->saveField('golesvisitante',2);
				}else{
					$this->Partido->id = $partido['Partido']['partido'];
					$this->Partido->saveField('goleslocal',2); //local gana
					$this->Partido->saveField('golesvisitante',0);
				}
				$this->Partido->id = $partido['Partido']['partido'];
				$this->Partido->saveField('estado',11);//Partido finalizo xq el usuario salio
				$this->Session->setFlash(__('Ha salido del partido', true));
				$this->redirect(array('action'=>'index',$salaId));
			}
		}else{ //no esta autenticado
			$this->Session->setFlash(__('No puede borrar el partido. Asegurese de loguearse', true));
			$this->redirect(array('controller' => 'users','action'=>'login'));
		}
		
	}
		
/*Trae todos los partidos dado un $id del user y que $tipo: ganado:1 perdido:2, empatado:3*/
	function estadisticasPartidos($id=null,$tipo=null, $cantidad=null){
		if($cantidad==null) $cantidad=100;
		$this->set('partidos',$this->Partido->estadisticaPartidos($id,$tipo, $cantidad));
		$this->set('tipo', $tipo);
	}
	

}
?>